package com.ruoyi.web.controller.common;

import com.ruoyi.common.service.FileAsyncService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CompletableFuture;

@RestController
public class FileAsyncController {

    private static final Logger log = LoggerFactory.getLogger(FileAsyncController.class);

    @Autowired
    private FileAsyncService fileAsyncService;

    /**
     * 接口：异步读取小文件
     */
    @GetMapping("/async/read-small-file")
    public ResponseEntity<String> readSmallFile(@RequestParam String filePath) {
        try {
            // 调用异步方法，立即返回 CompletableFuture（主线程不阻塞）
            CompletableFuture<List<String>> future = fileAsyncService.readSmallFileAsync(filePath);

            // 处理异步结果（回调函数，非阻塞）
            future.whenComplete((content, ex) -> {
                if (ex != null) {
                    log.error("小文件读取失败：", ex);
                    // 失败处理（如发送告警、记录日志）
                } else {
                    log.info("小文件读取成功，内容预览：{}", content.subList(0, Math.min(3, content.size())));
                    // 成功处理（如返回给前端、存储到数据库）
                }
            });

            // 主线程立即返回响应（告知客户端异步任务已启动）
            return ResponseEntity.ok("小文件读取任务已启动，请等待结果（可通过日志或回调查看）");
        } catch (IOException e) {
            log.error("小文件读取请求参数错误：", e);
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("文件错误：" + e.getMessage());
        }
    }

    /**
     * 接口：异步读取大文件
     */
    @GetMapping("/async/read-large-file")
    public ResponseEntity<String> readLargeFile(@RequestParam String filePath) {
        try {
            // 调用异步大文件读取，传入每行数据的回调处理
            CompletableFuture<Long> future = fileAsyncService.readLargeFileAsync(
                    filePath,
                    (line, lineNum) -> {
                        // 每行数据的处理逻辑（如解析、过滤、写入数据库）
                        if (lineNum % 1000 == 0) {
                            log.info("大文件读取进度：已处理 {} 行", lineNum);
                        }
                        // 示例：过滤空行并打印
                        if (!line.trim().isEmpty()) {
                            // System.out.println("第 " + lineNum + " 行：" + line);
                        }
                    }
            );

            // 处理异步结果
            future.whenComplete((totalLines, ex) -> {
                if (ex != null) {
                    log.error("大文件读取失败：", ex);
                } else {
                    log.info("大文件读取成功，共处理 {} 行", totalLines);
                }
            });

            return ResponseEntity.ok("大文件读取任务已启动，总行数将在完成后日志输出");
        } catch (IOException e) {
            log.error("大文件读取请求参数错误：", e);
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("文件错误：" + e.getMessage());
        }
    }
}
